fn main() {
    let _a: () = some_fn();
    println!("This function returns and you can see this line.");
    foobar();
//    let _x:! = panic!("This at once call never returns.");
//    println!("You will at once never see this line!");

//   类型的主要优点是它可以被转换为任何其他类型，从而可以在需要精确类型的地方使用，
//   例如在 match 匹配分支类型的主要优点是它可以被转换为任何其他类型，
//   从而可以在需要精确类型的地方使用，例如在 match 匹配分支 
//   这也是永循环(如loop{})的函数(如网络服务器)或终止进程的函数(如 exit（）)的返回类型。
    fn sum_odd_numbers(up_to:u32) -> u32 {
        let mut acc = 0;
        for n in 0..up_to {
            //注意这个match表达式的返回值必须为u32
            //因为"addition"变量是这个类型
            let addition: u32 = match n % 2 == 1 {
                // "n" 变量的类型是u32
                true => n,
                // 另一个方面 "continue"表达式不返回u32,是有问题的
                // 但因为它永远不返回，因此不会违反匹配表达式的类型要求
                false => continue,
            };
            acc += addition;
        }
        acc
    }
    println!("Sum of odd numbers up to 9 (excluding): {}", sum_odd_numbers(9));
}
// 使用!标记，是一个空类型和所有其他类型相反，这个类型无法实例化，因为可能具有的所有可能值的集合为空
fn foobar() -> ! {
    panic!("This call never returns");
    println!("You will never see this line!");
}
// 注意：它与()类型不同，这个代表只有一个可能的值
fn some_fn(){
    ()    
}

